// 组件: zj-refresh-load 刷新&加载
// https://developers.weixin.qq.com/miniprogram/dev/component/scroll-view.html
// ==================== 参数 ====================
// ※ isRefresh ==> 是否有刷新事件 (默认: true)
// ※ isLoad ==> 是否有加载事件 (默认: true)
// ※ refreshing ==> 是否正在刷新中(双向绑定) (默认: false)
// ※ loading ==> 是否正在加载中(双向绑定) (默认: false)
// ※ model ==> 双向绑定时父组件的键名 (默认: [])
// ※ modelKey ==> 双向绑定时子组件对应键名 (默认: [])
// ※ backTop ==> 滚动条回到顶部(只要改变值就回到顶部)
// ==================== 事件 ====================
// ※ bind:model="model(e)" ==> 双向绑定
// ※ bind:refresh="refresh(e)" ==> 刷新
// ※ bind:load="load(e)" ==> 加载
// ==================== 插槽 slot ====================
// ※ 默认插槽 ==> xxxxx
// ==================== 方法 ====================
// ※ xxxxx ==> xxxxx
Component({
  properties: {
    isRefresh: { // 是否有刷新事件
      type: Boolean,
      optionalTypes: [String, Number, Boolean],
      value: true
    },
    isLoad: { // 是否有加载事件
      type: Boolean,
      optionalTypes: [String, Number, Boolean],
      value: true
    },
    refreshing: { // 是否正在刷新中(双向绑定)
      type: Boolean,
      optionalTypes: [String, Number, Boolean],
      value: false
    },
    loading: { // 是否正在加载中(双向绑定)
      type: Boolean,
      optionalTypes: [String, Number, Boolean],
      value: false
    },
    model: { // 双向绑定时父组件的键名
      type: Array,
      value: []
    },
    modelKey: { // 双向绑定时子组件对应键名
      type: Array,
      value: []
    },
    backTop: { // 滚动条回到顶部(只要改变值就回到顶部)
      type: Boolean,
      optionalTypes: [String, Number, Boolean]
    }
  },
  data: {
    scrollTop: 0
  },
  observers: {
    // ========== 监听'滚动条回到顶部', 只要改变值就回到顶部 ==========
    'backTop': function (backTop) {
      this.setData({ scrollTop: 0 })
    }
  },
  methods: {
    // ========== 刷新 ==========
    refresh (e) {
      this.triggerEvent('model', {
        refreshing: true,
        loading: this.properties.loading,
        model: this.properties.model,
        modelKey: this.properties.modelKey,
      })
      this.triggerEvent('refresh', e)
    },
    // ========== 加载 ==========
    load (e) {
      if (!this.properties.isLoad) return
      if (this.properties.loading) return
      this.triggerEvent('model', {
        refreshing: this.properties.refreshing,
        loading: true,
        model: this.properties.model,
        modelKey: this.properties.modelKey,
      })
      this.triggerEvent('load', e)
    }
  }
})
